//
//  CAIPhotoAuthorizationManager.h
//  CollagePicture
//
//  Created by simon on 2021/11/9.
//  Copyright © 2021 zxm. All rights reserved.
//
//  （1）授权相关：旧 API 废弃，增加 PHAccessLevel 参数。如果再使用以前的API来获取权限状态， PHAuthorizationStatusLimited 状态下也会返回 PHAuthorizationStatusAuthorized。
//  （2）iOS14 中当用户选择“PHAuthorizationStatusLimited” 时，如果未进行适配，权限提示框会在每次app冷启动后打开相册并选择照片后重新弹出。触发弹窗询问用户是否需要修改所选照片。
//  （3）PHImagePickerController和UIImagePickerController一样，不需要请求访问相册权限，就可以访问；

//  注意：
//  （1）当我们使用UIImagePickerController的时候，默认它的页面是英文的，如果需要显示中文字，则必须在：Project-->Info-->Localizations 添加 Chinese简体中文; （2）如果加入了这个类，则必须添加隐私权限key-value；从2019年春季开始，如果应用程序的代码引用一个或多个访问敏感用户数据的api，所有提交到AppStore的访问用户数据的应用程序都必须包含一个目的字符串。如果您正在使用外部库或sdk，它们可能会引用需要目的字符串的api。虽然您的应用程序可能不使用这些api，但仍然需要一个目的字符串。
//  必须在info.plist文件中添加隐私权限提示key-value；
//  key1: Privacy - Photo Library Usage Description 读相册权限；iOS11之前的需要，iOS11开始不需要；
//  value：App需要您的同意，才能访问相册，以便在xxx上传您的图片
//  key2: Prevent limited photos access alert; 读相册限制照片数量阻止每次访问弹出权限；
//  value YES；
//  key3: Privacy - Photo Library Additions Usage Description; 存相册权限；
//  value：若不允许，您将无法保存xx的照片到本地相册
//  key4: Privacy - Camera Usage Description  相机拍摄权限
//  value：用于在xxx拍摄图片、视频以供上传
//  key5: Privacy - Microphone Usage Description 相机拍视频时的麦克风权限
//  value：用于在xxx中拍摄视频声音以供上传

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

///授权类型
typedef NS_ENUM(NSUInteger, ZXPhotoAuthorizationType) {
    ZXPhotoAuthorizationTypePhotoLibrary,        // 相册
    ZXPhotoAuthorizationTypeAVCaptureCamera,     // 相机
};

/// 授权状态
typedef NS_ENUM(NSUInteger, ZXPhotoAuthorizationStatus){
    ZXPhotoAuthorizationStatusNotDetermined = 0, // 未对访问授权做出选择
    ZXPhotoAuthorizationStatusDenied,            // 拒绝访问
    ZXPhotoAuthorizationStatusAuthorized,        // 已授权；在业务中应该是继续执行后面的主进程；
    ZXPhotoAuthorizationStatusRestricted,        // 应用没有相关权限，且当前用户无法改变这个权限，比如：家长控制
    ZXPhotoAuthorizationStatusAlertDeniedOrRestricted,      // 系统授权提示弹框中的交互，点击拒绝授权返回的状态；因为提示弹窗点击后，还要继续执行后面的主进程；
    ZXPhotoAuthorizationStatusNotSupport         // 不支持授权
};


@class CAIPhotoAuthorizationManager;
@protocol ZXAuthorizationManagerDelegate <NSObject>


/**
 检查授权的时候，如果没有授权，则自定义回调代理；
 当然也可以用第二种方法，调用检查授权方法zx_requestPhotoLibraryAuthorization:，再根据block回调判断授权状态来提示；

 @param authorizationType 授权类型
 */

- (void)showAlertViewWithPhotoAuthorizationManager:(CAIPhotoAuthorizationManager *)manager authorizationType:(ZXPhotoAuthorizationType)authorizationType;

@end


@interface CAIPhotoAuthorizationManager : NSObject

+ (instancetype)shareInstance;

@property (nonatomic, weak) id<ZXAuthorizationManagerDelegate>delegate;


/**
 检查相册授权及回调；调用requestPhotoLibraryAuthorizationWithDeniedAlertViewInViewController:call:方法；

 @param callback 回调block
 */
+ (void)requestPhotoLibraryAuthorization:(void(^)(ZXPhotoAuthorizationStatus status))callback;

/**
 检查相册授权及回调，当权限是被拒绝的时候会有默认AlertController提示指引;
 授权相关：旧 API 废弃，增加 PHAccessLevel 参数。如果再使用以前的API来获取权限状态， PHAuthorizationStatusLimited 状态下也会返回 PHAuthorizationStatusAuthorized；
 PHImagePickerController、UIImagePickerController不需要请求访问相册权限，就可以访问；
 @param sourceController 原控制器，如果需要默认提示则一定要这个值；
 */
- (void)requestPhotoLibraryAuthorizationWithDeniedAlertViewInViewController:(nullable UIViewController *)sourceController call:(void(^)(ZXPhotoAuthorizationStatus status))callback;


/**
 检查摄像头/相机 授权及回调
 
 @param callback 回调block
 */
+ (void)requestCameraAuthorization:(void(^)(ZXPhotoAuthorizationStatus status))callback;

/**
 检查摄像头/相机授权及提示指引;当权限是被拒绝的时候会有默认AlertController提示指引;

 @param sourceController 原控制器，如果需要默认提示则一定要这个值；
 */
- (void)requestCameraAuthorizationWithDeniedAlertViewInViewController:(nullable UIViewController *)sourceController call:(void(^)(ZXPhotoAuthorizationStatus status))callback;



@end

NS_ASSUME_NONNULL_END
